package com.bdqn.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

/**
 * 测试3-获取类的构造方法
 *
 * @author LILIBO
 * @since 2024/6/27
 */
public class Test03Constructor {

    public static void main(String[] args) {
        // 方式三（重要）：通过类的名称（字符串）获取类的Class对象
        String className = "com.bdqn.reflect.pojo.Person";
        try {
            Class clazz = Class.forName(className);
            // 获取类的public构造函数（带一个String类型参数的）
            // Constructor constructor = clazz.getConstructor(String.class);
            // 获取类的所有public构造函数
            Constructor[] constructors = clazz.getConstructors();
            // 获取类的所有构造函数（公开的或不公开的都能获取）
            // Constructor[] constructors = clazz.getDeclaredConstructors();
            System.out.println("类的构造函数：clazz.getDeclaredConstructors()");
            int index = 1;
            for (Constructor constructor : constructors) {
                int modifier = constructor.getModifiers();
                String modifierStr = "";
                if ((modifier & Modifier.PUBLIC) == Modifier.PUBLIC) {
                    modifierStr = "public";
                } else if ((modifier & Modifier.PRIVATE) == Modifier.PRIVATE) {
                    modifierStr = "private";
                } else if ((modifier & Modifier.PROTECTED) == Modifier.PROTECTED) {
                    modifierStr = "protected";
                } else {
                    modifierStr = "default(package)";
                }
                System.out.println((index++) + " " + modifierStr + "\n--------");
                Class[] params = constructor.getParameterTypes();
                for (int i = 0; i < params.length; i++) {
                    if (i != 0) {
                        System.out.print(", ");
                    }
                    System.out.print(params[i].getName());
                }
                System.out.println("\n--------");
            }
        } catch (ClassNotFoundException e) {
            e.fillInStackTrace();
        }

    }

}
